#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
arc.py - 电弧检测器模块

该模块实现了电弧检测器的状态监控功能，包括：
1. 电弧状态检测
2. 状态变化回调
3. 指示器控制
4. 连接状态监控
"""

from epics import PV, caget
import datetime
import threading

class status(object):
    """
    电弧检测器状态类
    
    该类用于监控单个通道的电弧检测器状态，可以通过ARC检测器或LLRF进行检测。
    主要功能包括：
    1. 状态监控
    2. 状态变化回调
    3. 指示器控制
    4. 连接状态监控
    """
    
    @property
    def status_now(self):
        """
        获取当前状态
        
        返回：
            int: 当前状态值
        """
        return self.pv.get()

    @property
    def status(self):
        """
        获取状态描述
        
        返回：
            str: 状态描述字符串
        """
        return self.detector_name+' = '+str(self.status_now)

    @property
    def indicator(self):
        """
        获取指示器状态
        
        返回：
            int: 指示器状态值
        """
        return self.indicator_pv.get()
        
    @indicator.setter
    def indicator(self, _value):
        """
        设置指示器状态
        
        参数：
            _value (int): 要设置的指示器状态值
        """
        self.indicator_pv.put(_value)

    def check_status(self, value):
        """
        检查状态并更新指示器
        
        参数：
            value (int): 要检查的状态值
        """
        if value == 0:
            self.count += 1
            if self.indicator_lock is False:
                self.indicator_lock = True
                self.indicator = self.level
            self.callback_function()
        else:
            if self.indicator_lock is False:
                self.indicator = 0
            pass

    def onStatusChange(self, pvname=None, value=None, conn=None, host=None, timestamp=None, **kwargs):
        """
        状态变化回调函数
        
        参数：
            pvname (str): PV名称
            value (int): 新的状态值
            conn (bool): 连接状态
            host (str): 主机名
            timestamp (float): 时间戳
        """
        self.value = value
        if self.init_status is True:
            self.timestamp = timestamp
            self.check_status(value)
            if (conn is False):
                # 生成PV连接丢失告警
                if self.logging is None:
                    print('ca connection status changed: ', pvname, conn, host)
                else:
                    self.logging.info('ca connection status changed:  %s %s %s', pvname, conn, host)
            else: pass
        else: pass

    def callback_function(self):
        """
        执行回调函数
        """
        if callable(self.callback):
            self.callback(self)
        else: pass

    def __init__(self, detector_name, indicator_name, level=None, callback=None, logging=None, *args, **kwargs):
        """
        初始化电弧检测器状态对象
        
        参数：
            detector_name (tuple): 检测器名称
            indicator_name (tuple): 指示器名称
            level (int, optional): 指示器级别
            callback (function, optional): 回调函数
            logging (Logger, optional): 日志记录器
        """
        self.init_status = False
        self.logging = logging
        self.callback = callback
        if level is None:
            self.level = 1
        else:
            self.level = level
        self.detector_name = detector_name[1]
        caget(self.detector_name)
        self.pv = PV(self.detector_name, callback=self.onStatusChange)
        self.indicator_name = indicator_name[1]
        self.indicator_pv = PV(self.indicator_name)
        self.indicator_lock = False
        self.count = 0
        self.value= self.status_now
        self.timestamp = None
        self.check_status(self.status_now)
        self.init_status = True

    def __del__(self):
        """
        析构函数，打印删除实例信息
        """
        print('Delete arc.status instance -> '+self.detector_name)

def main():
    """
    主函数（空实现）
    """
    pass

if __name__ == '__main__':
    main()
